package com.zzvcom.office.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;

;

/**
 * 文件处理的工具类
 * @author yujikuan
 */
@Slf4j
@Component
public class MyFileUtil {
    private static int DEFAULT_BUFFER_SIZE = 8192;

    /**
     * 根据url，获取文件名
     *
     * @param url 文件的url
     * @return
     */
    public String getFileName(final String url) {
       return CommonUtil.getFileNameByPath(url);
    }


      /**
     * 仅仅文件不存在的时创建文件，流自动关闭
     * create a new file if it does not exist
     *
     * @param path   the path to the file
     * @param stream the input stream
     * @return 如果文件已存在返回 true；如果文件创建成功也返回 true；否则返回 false
     */
    public boolean createFileNotExists(final Path path, final InputStream stream) {
        // 参数校验提前到入口处
        if (path == null || stream == null) {
            log.warn("参数 path 或 stream 为 null");
            return false;
        }
        try (InputStream inputStream = stream) { // 正确使用 try-with-resources 管理流
            return createFileNotExistsHelper(path, inputStream);
        } catch (IOException e) {
            log.error("文件操作或流关闭过程中发生异常，路径：{}", path, e);
            return false;
        }
    }

    private static boolean createFileNotExistsHelper(Path path, InputStream stream) throws IOException {
        // 文件已存在直接返回 true
        if (Files.exists(path)) {
            log.debug("文件已存在: {}", path);
            return true;
        }
        // 创建父目录
        Path parent = path.getParent();
        if (parent != null && !Files.exists(parent)) {
            Files.createDirectories(parent);
        }
        try {
            Files.copy(stream, path);
        } catch (FileAlreadyExistsException e) {
            // 并发情况下文件可能已被创建，此时返回 true
            log.debug("并发创建文件时发现文件已存在: {}", path);
            return true;
        }
        return true;
    }


/**
 * 获取文件名的扩展名
 *
 * @param fileName 文件名字符串
 * @return 返回文件扩展名（小写），如果文件名为空、不包含点号或扩展名为空则返回null
 */
public static String getExtension(final String fileName) {
    // 检查文件名是否为空
    if (fileName == null) {
        return null;
    }
    // 查找最后一个点号的位置
    int lastDotIndex = fileName.lastIndexOf(".");
    // 点号不存在、在末尾、或者整个字符串就是点号，则无有效扩展名
    if (lastDotIndex <= 0 || lastDotIndex == fileName.length() - 1) {
        return null;
    }
    // 提取扩展名部分
    String extension = fileName.substring(lastDotIndex + 1);
    return  extension.toLowerCase();
}
}
